#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
#include "kernel/fs.h"

char*
fmtname(char *path)
{
  char *p;

  // Find first character after last slash.
  for(p=path+strlen(path); p >= path && *p != '/'; p--);
  p++;

  return p;
}


void
find(char *filename, char *path)
{
  char buf[512], *p;
  int fd;
  struct dirent de;
  struct stat st;

  if((fd = open(path, 0)) < 0){
    fprintf(2, "find: cannot open %s\n", path);
    return;
  }

  if(fstat(fd, &st) < 0){
    fprintf(2, "find: cannot stat %s\n", path);
    close(fd);
    return;
  }

  switch(st.type){
  	case T_FILE:
		if(strcmp(fmtname(path), filename) == 0){
			fprintf(1, "%s\n", path);
		}
    		break;

  	case T_DIR:
    		if(strlen(path) + 1 + DIRSIZ + 1 > sizeof buf){
      			fprintf(2, "find: path too long\n");
      			break;
    		}
  		strcpy(buf, path);
 		p = buf+strlen(buf);
  		*p++ = '/';
  		while(read(fd, &de, sizeof(de)) == sizeof(de)){
      			if(de.inum == 0)
        			continue;
			if(strcmp(".", de.name) == 0 || strcmp("..", de.name) == 0)
				continue;
      			memmove(p, de.name, DIRSIZ);
      			p[DIRSIZ] = 0;
      			find(filename, p);
    		}	
    		break;
  	}
 	 close(fd);
}

int
main(int argc, char *argv[])
{
  if(argc < 3){
    fprintf(2, "Find: Usage find [FILENAME]\n");
    exit(1);
  }
  find(argv[2], argv[1]);
  exit(0);
}

